package com.sojson.util.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;

/**
 * 分布式锁接口
 * 
 * @author liu
 * @date 2020-11-15
 */
public interface CustomLock {

    /**
     * 获取默认锁(有获取锁的超时时间,有使用锁的超时时间)
     * 
     * @return
     * @throws Exception 
     */
    boolean defaultLock() throws Exception;

    /**
     * 获取默认锁
     * 
     * @param timeOutUse    使用锁的超时时间(单位: 秒,不设置为30秒)
     * @return
     * @throws Exception 
     */
    boolean defaultLock(long timeOutUse) throws Exception;

    /**
     * 获取默认锁
     * 
     * @param timeOutUse    使用锁的超时时间(单位: 秒,不设置为30秒)
     * @param unit          使用锁的超时时间单位
     * @return
     * @throws Exception 
     */
    boolean defaultLock(long timeOutUse, TimeUnit unit) throws Exception;

    /**
     * 获取锁,如果获取到就结束,没有获取到就一直暂停直到抛异常或者程序结束
     * @throws Exception 
     */
    boolean lock() throws Exception;

    /**
     * 获取锁,如果获取到返回true,没有获取到返回false
     * 
     * @return
     * @throws Exception 
     */
    boolean tryLock() throws Exception;

    /**
     * 在给定的时间内获取锁,如果获取到返回true,超时或者没有获取到返回false
     * 
     * @param timeOutGet    获取锁的超时时间(单位: 秒,不设置为10秒)
     * @return
     * @throws Exception 
     */
    boolean tryLock(long timeOutGet) throws Exception;

    /**
     * 在给定的时间内获取锁,如果获取到返回true,超时或者没有获取到返回false
     * 
     * @param timeOutGet    获取锁的超时时间(单位: 秒,不设置为10秒)
     * @param unit          获取锁的超时时间单位
     * @return
     * @throws Exception 
     */
    boolean tryLock(long timeOutGet, TimeUnit unit) throws Exception;

    /**
     * 在给定的时间内获取锁,如果获取到返回true,超时或者没有获取到返回false
     * 
     * @param timeOutGet    获取锁的超时时间(单位: 秒,不设置为10秒)
     * @param timeOutUse    使用锁的超时时间(单位: 秒,不设置为30秒)
     * @return
     * @throws Exception 
     */
    boolean lock(long timeOutGet, long timeOutUse) throws Exception;

    /**
     * 在给定的时间内获取锁,如果获取到返回true,超时或者没有获取到返回false
     * 
     * @param timeOutGet    获取锁的超时时间(单位: 秒,不设置为10秒)
     * @param timeOutUse    使用锁的超时时间(单位: 秒,不设置为30秒)
     * @param unit          锁的超时时间单位
     * @return
     * @throws Exception 
     */
    boolean lock(long timeOutGet, long timeOutUse, TimeUnit unit) throws Exception;

    /**
     * 释放锁
     */
    void unlock();

    /**
     * 
     * 
     * @throws InterruptedException
     */
    void lockInterruptibly() throws InterruptedException;

    /**
     * 
     * 
     * @return
     */
    Condition newCondition();

}